#pragma once

//typedef struct{
//	int front, rear;
//	int data[50];
//	int tag;
//}Queue;
//
//void InitQueue(Queue* q)
//{
//	q->front = q->rear = 0;
//	q->tag = -1;
//}
//
//bool EnQueue(Queue* q, int x)
//{
//	q->data[q->rear++] = x;
//	q->tag=1;
//	return true;
//}
//
//bool DeQueue(Queue* q, int* x)
//{
//	if (q->front == q->rear)
//	{
//		return false;
//	}
//	*x = q->data[q->front++];
//	q->tag=0;
//	return true;
//}
//
//bool IsEmptyQ(Queue* q)
//{
//	if (q->front == q->rear && q->tag==0)
//		return true;
//	else
//		return false;
//}

typedef struct LinkNode{
	int data;
	struct LinkNode* next;
}LinkNode,*LinkList;

typedef struct{
	LinkNode* rear, *front;
}Queue;

void InitQueue(Queue* q)
{
	q->front = q->rear = (LinkNode*)malloc(sizeof(LinkNode)); // void*
	q->front->next = NULL;
}

void EnQueue(Queue* q, int x)
{
	LinkNode* temp = (LinkNode*)malloc(sizeof(LinkNode));
	temp->next = q->rear->next;
	q->rear->next = temp;
	q->rear = temp;
	temp->data = x;
}

bool DeQueue(Queue* q, int *x)
{
	if (q->front == q->rear)
		return false;
	LinkNode* p = q->front->next;
	*x = p->data;
	q->front->next = p->next;
	if (q->front->next == NULL)
		q->rear = q->front;
	free(p);
}

bool IsEmptyQ(Queue* q)
{
	if (q->rear == q->front)
		return true;
	else
		return false;
}









